home *** CD-ROM | disk | FTP | other *** search
/ C & C++ Multimedia Cyber Classroom / C and C++ Multimedia Cyber Classroom (Prentice Hall) (1998).iso / cpphtp2 / code.jar / code / ch21 / fig21_07.txt < prev    next >
Text File  |  1998-02-27  |  2KB  |  75 lines

  1. 1   // Fig. 21.7: fig21_07.cpp
  2. 2   // Demonstrating dynamic_cast.
  3. 3   #include <iostream.h>
  4. 4   
  5. 5   const double PI = 3.14159;
  6. 6   
  7. 7   class Shape {
  8. 8      public:
  9. 9         virtual double area() const { return 0.0; }
  10. 10  };
  11. 11  
  12. 12  class Circle: public Shape {
  13. 13  public:
  14. 14     Circle( int r = 1 ) { radius = r; }
  15. 15  
  16. 16     virtual double area() const 
  17. 17     { 
  18. 18        return PI * radius * radius; 
  19. 19     };
  20. 20  protected:
  21. 21     int radius;
  22. 22  };
  23. 23  
  24. 24  class Cylinder: public Circle {
  25. 25  public:
  26. 26     Cylinder( int h = 1 ) { height = h; }
  27. 27  
  28. 28     virtual double area() const 
  29. 29     {     
  30. 30        return 2 * PI * radius * height + 
  31. 31               2 * Circle::area();
  32. 32     }
  33. 33  private:
  34. 34     int height;
  35. 35  };
  36. 36  
  37. 37  void outputShapeArea( const Shape * );    // prototype
  38. 38  
  39. 39  int main()
  40. 40  {
  41. 41     Circle circle;
  42. 42     Cylinder cylinder;
  43. 43     Shape *ptr = 0;
  44. 44  
  45. 45     outputShapeArea( &circle );    // output circle's area
  46. 46     outputShapeArea( &cylinder );  // output cylinder's area
  47. 47     outputShapeArea( ptr );        // attempt to output area
  48. 48     return 0;
  49. 49  }
  50. 50  
  51. 51  void outputShapeArea( const Shape *shapePtr )
  52. 52  {
  53. 53     const Circle *circlePtr;
  54. 54     const Cylinder *cylinderPtr;
  55. 55  
  56. 56     // cast Shape * to a Cylinder *
  57. 57     cylinderPtr = dynamic_cast< const Cylinder * >( shapePtr );
  58. 58  
  59. 59     if ( cylinderPtr != 0 )  // if true, invoke area()
  60. 60        cout << "Cylinder's area: " << cylinderPtr->area();  
  61. 61     else {  // shapePtr does not refer to a cylinder
  62. 62        
  63. 63        // cast shapePtr to a Circle *
  64. 64        circlePtr = dynamic_cast< const Circle * >( shapePtr );
  65. 65  
  66. 66        if ( circlePtr != 0 )  // if true, invoke area()
  67. 67           cout << "Circle's area: " << circlePtr->area(); 
  68. 68        else
  69. 69           cout << "Neither a Circle nor a Cylinder.";
  70. 70     }
  71. 71  
  72. 72     cout << endl;
  73. 73  }
  74. }
  75.